#define _CRT_SECURE_NO_WARNINGS 1
//#include<bits/stdc++.h>
//using namespace std;
////http://oj33.cn/contest.php?cid=1075
////https://blog.csdn.net/qq_37482202/article/details/89513877
//int n, m;
//int Arr[505][505];
//
//const int Max = 1 << 20;
//void floyd()
//{
//	int k, v, w;
//	for (k = 1; k <= m; k++)
//	{
//		for (v = 1; v <= m; v++)
//		{
//			for (w = 1; w <= m; w++)
//			{
//				if (Arr[v][w] > Arr[v][k] + Arr[k][w])
//				{
//					Arr[v][w] = Arr[v][k] + Arr[k][w];
//
//				}
//			}
//		}
//	}
//	if (Arr[1][m] == Max)
//	{
//		cout << "NO" << endl;
//	}
//	else
//	{
//		cout << Arr[1][m] << endl;
//	}
//}
//int main()
//{
//	cin >> n >> m;
//	memset(Arr, 10000, sizeof(Arr));
//	char a=' ', b = ' ';
//	string s;
//	int pathpoint[505][505];
//	memset(pathpoint, 0, sizeof(pathpoint));
//	int x = 1, y = 1;
//	for (int j = 0; j <=n; j++)
//	{
//		while (scanf("%c",&a)!=EOF)
//		{
//			if (a <= '9' && a >= '0')
//			{
//				pathpoint[x][y++] = a - '0';
//
//			}
//			else if (a == '\n')break;
//		}
//		y = 1;
//		x++;
//	}
//	for (int i = 1; i < m; i++)
//	{
//		for (int j = 1; j < m-1; j++)
//		{
//			if (pathpoint[i][j] != 0&& pathpoint[i][j+1]!=0)
//			{
//				Arr[pathpoint[i][j]][pathpoint[i][j + 1]] = 1;
//				Arr[pathpoint[i][j + 1]][pathpoint[i][j]] = 1;
//
//			}
//		}
//	
//	}
//	floyd();
//	return 0;
//}

#include <bits/stdc++.h>
using namespace std;

const int Max = 505;
int n, m, f[Max][Max], tot, num[Max], x;
void ff()
{
	for (int k = 1; k <= n; k++)
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= n; j++)
				f[i][j] = min(f[i][j], f[i][k] + f[k][j]);
}
void p()
{
	if (f[1][n] <= m + 1) cout << f[1][n] - 1;
	else cout << "NO";
}
int main()
{
	scanf("%d%d", &m, &n);
	memset(f, 0x3f3f3f, sizeof(f));
	for (int i = 1; i <= m; i++)
	{
		tot = 0; char ch = '0';
		do
		{
			if (ch == '\n')break;
			scanf("%d", &x);
			num[++tot] = x;
		} while (scanf("%c", &ch) != EOF);
		for (int i = 1; i < tot; i++)
			for (int j = i + 1; j <= tot; j++) f[num[i]][num[j]] = 1;
	}
	ff();
	p();
	return 0;
}